Amazon ECS Anywhereを使ってAWS外でもコンテナが運用できるようになったので使ってみた
5月27日にECSの機能を利用してオンプレミスでもコンテナの実行、管理を可能にするAmazon ECS Anywhereが利用可能になりました。
今回はそれを使ってUbuntu上にECSからコンテナを起動させてみたいと思います。
Amazon ECS Anywhere
ECSは従来EC2やAWS FargateなどAWSが提供するコンピュートリソース上でのみ実行可能でした。 しかし、今回提供されたAmazon ECS Anywhereを使用すればオンプレミスでも今までと近い操作でコンテナの実行、管理が可能となります。 AWSが提供しているECSのコントロールプレーンに自分で用意したインスタンスを接続すればクラスターに参加できます。
EC2のECSインスタンスをオンプレミスで立ち上げてるような状態です。
仕組みとしてはSystems Manager Agentがインスタンス内で実行され、それがDockerエンジンを操作し、そのDocker上で動くECS AgentがECSと連携しタスクやコンテナの起動を管理するといった感じです。
ただ、VPCの外でこれらは実行されるため、もしRDSなどVPC内のリソースを使用したい場合はVPNなどを使ってVPCと通信可能にする必要があります。 詳しくは以下のブログに書いてあります。
以下では自分が実際にやってみた手順を示しておきます。 ブログではRaspberry Piを使用してクラスタを組んでいましたが、自分はUbuntu上に1つだけインスタンスを立てます。
これからやること
- ECSクラスターの作成
- Externalインスタンスの接続
- サービスの作成
- タスクの実行
ECS Anywhereを使ってみる
ECS クラスターを作成する
今回はネットワーキングのみで作成しました。
クラスターの名前は ecs-external
としています。
ここで言うExternalインスタンスがECS Anywhereによって管理されるインスタンスになります。
Externalインスタンスを登録する
Externalインスタンスを立ち上げ、クラスターに参加させましょう。
「Externalインスタンスの登録」を押した後ステップ2で出てくるコマンドを実行するだけでセットアップは完了です
このcurl~
から始まるコマンドをコピーし管理者権限で実行すればセットアップは終わります。
このコマンドに含まれるアクティベーションコードによって登録が行われています。
VMに必要なものをインストールする
自分はMultipassでUbuntu20.04(x86_64)を用意しました。 MultipassはCanonical社が開発しているVM管理ソフトです。 概ねDockerのような操作感です。
$ multipass find # 使用できるイメージを探す Image Aliases Version Description 18.04 bionic 20210512 Ubuntu 18.04 LTS 20.04 focal,lts 20210510 Ubuntu 20.04 LTS 20.10 groovy 20210511.1 Ubuntu 20.10 $ multipass launch 20.04 --name ecs # VMの起動 Launched: ecs $ multipass list Name State IPv4 Image ecs Running XXX.XXX.XXX.XXX Ubuntu 20.04 LTS $ multipass exec ecs /bin/bash # VMにアタッチ ubuntu@ecs:~$ curl --proto "https" \ -o "/tmp/ecs-anywhere-install.sh" \ "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh" && \ sudo bash /tmp/ecs-anywhere-install.sh \ --region "ap-northeast-1" \ --cluster "ecs-external" \ --activation-id "XXXXXXXXXXXXX" \ --activation-code "XXXXXXX" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 19369 100 19369 0 0 20366 0 --:--:-- --:--:-- --:--:-- 20345 Running ECS install script on ubuntu 20.04 # 中略 # Trying to wait for ECS agent to start ... Ping ECS Agent registered successfully! Container instance arn: "arn:aws:ecs:XXXXXXXX:XXXXXXXX:container-instance/ecs-external/XXXXXXXXXXX" You can check your ECS cluster here https://console.aws.amazon.com/ecs/home?region=XXXXXXXXXXX#/clusters/ecs-external # ok ########################## ########################## This script installed three open source packages that all use Apache License 2.0. You can view their license information here: - ECS Agent https://github.com/aws/amazon-ecs-agent/blob/master/LICENSE - SSM Agent https://github.com/aws/amazon-ssm-agent/blob/master/LICENSE - Docker engine https://github.com/moby/moby/blob/master/LICENSE ##########################
ブラウザに戻って確認してみるとインスタンスが増えています。
無事セットアップできたみたいですね。
サービスを作成しタスクを実行してみる
ここからは先ほど追加したインスタンス上でタスクが実行されるか確認していこうと思います。 今回はApacheサーバーを立ててみましょう。
タスクの定義
起動タイプはEXTERNAL
を選びましょう。
今回はシンプルにApacheのイメージを使用し、80番ポートをマッピングします。 メモリもそれほどいらないので256MiBで十分でしょう。
サービスの作成
タスクが定義できたらサービスを作成して、先ほどのタスクを実行してみましょう。
タスクが実行されているか確認する
サービスが作成できたらタスクが正しく実行されているか確認してみましょう。 Webコンソール上で見てみると一つタスクが実行中になっていますね。 利用可能なメモリも割り当てた分減っています。
再びVMに戻り、コンテナが実行されているか確認してみましょう。
ubuntu@ecs:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES XXXXXXXXXXXX httpd:2.4 "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp ecs-apache-1-apache-XXXXXXXXXXX XXXXXXXXXXXX amazon/amazon-ecs-agent:latest "/agent" 18 minutes ago Up 18 minutes (healthy) ecs-agent ubuntu@ecs:~$ curl localhost:80 <html><body><h1>It works!</h1></body></html>
curlでマップされたポートにリクエストを送ると、 無事にApacheサーバーからHTMLが送られてきました。
感想
セットアップが簡単で良いと思いました。手動でも10分もあればインスタンスを追加できるんじゃないでしょうか。
個人的にはオンプレミスでもクラウドと近いサービスを使えるというのは可能性が広がって好きです。